
// 模仿 Promise 构造函数 ( 仅关注 executor 是如何获得构造函数内部的函数的 )

function Arithmetic( executor ) {

    // 在函数的参数中使用 ...params 形式定义的参数就是 REST参数
    function addition(...params){
        let sum = 0 ;
        // 在 函数内部将 params 当作数组使用即可
        // 使用归并函数(reduce)实现数组求和: reduce( recuder , initial )
        // sum = params.reduce( (prev,curr) => prev + curr , sum );
        // 遍历数组并将每项累加到sum中
        params.forEach( p => sum += p );
        return sum ;
    }

    function subtract( minuend , subtrahend ) {
        return minuend - subtrahend ;
    }

    function multiply(...params){
        // 先尝试在数组中寻找 零
        let index = params.findIndex( p => p == 0 );
        // 如果找到了 零 则直接返回 零
        if( index != -1 ) {
            return 0 ;
        }
        let product = 1 ;
        // 使用归并函数对数组所有元素求乘积
        // product = params.reduce( (prev,curr) => prev * curr , product );
        params.forEach( p => product * p );
        return product ;
    }

    function divide( dividend , divisor ){
        return dividend / divisor;
    }

    executor( addition , subtract , multiply , divide );
}

let executor = function( add , sub , mult , div ){
    let x = add( 1 , 2 , 3 , 4 );
    console.log( x );
    let y = sub( 100 , 50 );
    console.log( y );
}

let a = new Arithmetic( executor );
console.log( a );